/**
 * @description 响应式类
 * @author xfj
 */

class Observable{
	constructor(data) {
		this.walk(data || {});
	}
	
	walk(data) {
		if(!data && typeof data !== 'object') {
			return;
		}
		for(let key in data) {
			this._defineRefract(data, key, data[key]);
		}
	}
	
	_defineRefract(target, key, value) {
		const dep = new Dep(key);
		Object.defineProperty(target, key, {
			enumerable: true, // 可枚举
			configurable: true, // 可配置
			get: function() {
				if(Dep.target) {
					dep.addSub(Dep.target);
				}
				return value;
			},
			set: function(newValue) {
				if(newValue !== value) {
					value = newValue;
					// 通知观察者数据发生了变更
					dep.notify(newValue);
				}
			}
		})
	}
}
